module Habitacion (Habitacion, nuevaH, numeroH, tipoH, accesoriosH, pretensionesDePopStarH) where

import Tipos

data Habitacion = A Accesorio Habitacion | H Int TipoHabitacion deriving (Show)

nuevaH :: Int -> TipoHabitacion -> [Accesorio] -> Habitacion
nuevaH x tipo (a:[]) = A a (H x tipo)
nuevaH x tipo (a:as) = A a (nuevaH x tipo as)

numeroH :: Habitacion -> Int
numeroH (H x _) = x
numeroH (A _ h) = numeroH h

tipoH :: Habitacion -> TipoHabitacion
tipoH (H _ t) = t
tipoH (A _ h) = tipoH h

accesoriosH :: Habitacion -> [Accesorio]
accesoriosH (H _ _) = []
accesoriosH (A a h) = a : (accesoriosH h)

pretensionesDePopStarH :: [Accesorio] -> [Habitacion] -> [Habitacion]
pretensionesDePopStarH as hs = dameHabitacionesConCantAcc as hs (cantidadMaximaDeAccesorios as hs)

-- Auxiliares -- 

cantidadMaximaDeAccesorios :: [Accesorio] -> [Habitacion] -> Int -- esta función tiene algo mal...
cantidadMaximaDeAccesorios as hs = esMaximo as hs 0

esMaximo :: [Accesorio] -> [Habitacion] -> Int -> Int
esMaximo as (h:[]) max = if ((cantDeAccesorios as (accesoriosH h)) >= max) then (cantDeAccesorios as (accesoriosH h)) else max
esMaximo as (h:hs) max = if (cantDeAccesorios as (accesoriosH h)) >= (esMaximo as hs max) 
                        then esMaximo as hs (cantDeAccesorios as (accesoriosH h)) 
                        else esMaximo as hs max


dameHabitacionesConCantAcc :: [Accesorio] -> [Habitacion] -> Int -> [Habitacion]
dameHabitacionesConCantAcc as (h:[]) n = if (cantDeAccesorios as (accesoriosH h)) == n then [h] else []
dameHabitacionesConCantAcc as (h:hs) n = (if (cantDeAccesorios as (accesoriosH h))  == n then [h] else []) ++ dameHabitacionesConCantAcc as hs n

cantDeAccesorios :: [Accesorio] -> [Accesorio] -> Int
cantDeAccesorios (x:[]) as = if elem x as then 1 else 0
cantDeAccesorios (x:xs) as = (if elem x as then 1 else 0) + cantDeAccesorios xs as
